package org.lanyu.springainovel.chat.controller;

import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.lanyu.springainovel.chat.service.PromptTemplateService;
import org.lanyu.springainovel.common.entity.MyPromptTemplate;
import org.lanyu.springainovel.common.vo.RestVO;
import org.lanyu.springainovel.chat.vo.TestPromptQuestionVO;
import org.springframework.http.MediaType;
import reactor.core.publisher.Flux;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "提示词模版", description = "提示词模版")
@RestController
@RequestMapping("/prompt/templates")
@AllArgsConstructor
public class PromptTemplateController {

    private final PromptTemplateService promptTemplateService;
    
    /**
     * 获取所有可用的提示词模版
     */
    @GetMapping
    public RestVO<List<MyPromptTemplate>> getAllTemplates() {
        try {
            List<MyPromptTemplate> templates = promptTemplateService.getAllActiveTemplates();
            return RestVO.success(templates);
        } catch (Exception e) {
            return RestVO.fail("获取模板列表失败: " + e.getMessage());
        }
    }
    
    /**
     * 根据分类获取模板
     */
    @GetMapping("/category/{category}")
    public RestVO<List<MyPromptTemplate>> getTemplatesByCategory(@PathVariable String category) {
        try {
            List<MyPromptTemplate> templates = promptTemplateService.getTemplatesByCategory(category);
            return RestVO.success(templates);
        } catch (Exception e) {
            return RestVO.fail("获取分类模板失败: " + e.getMessage());
        }
    }
    
    /**
     * 根据标签搜索模板
     */
    @GetMapping("/search/tag")
    public RestVO<List<MyPromptTemplate>> searchTemplatesByTag(@RequestParam String tag) {
        try {
            List<MyPromptTemplate> templates = promptTemplateService.searchTemplatesByTag(tag);
            return RestVO.success(templates);
        } catch (Exception e) {
            return RestVO.fail("搜索模板失败: " + e.getMessage());
        }
    }
    
    /**
     * 根据名称搜索模板
     */
    @GetMapping("/search/name")
    public RestVO<List<MyPromptTemplate>> searchTemplatesByName(@RequestParam String name) {
        try {
            List<MyPromptTemplate> templates = promptTemplateService.searchTemplatesByName(name);
            return RestVO.success(templates);
        } catch (Exception e) {
            return RestVO.fail("搜索模板失败: " + e.getMessage());
        }
    }
    
    /**
     * 根据ID获取模板
     */
    @GetMapping("/{id}")
    public RestVO<MyPromptTemplate> getTemplateById(@PathVariable Long id) {
        try {
            MyPromptTemplate template = promptTemplateService.getTemplateById(id);
            if (template!=null) {
                return RestVO.success(template);
            } else {
                return RestVO.fail("模板不存在");
            }
        } catch (Exception e) {
            return RestVO.fail("获取模板失败: " + e.getMessage());
        }
    }
    
    /**
     * 创建新模版
     */
    @PostMapping
    public RestVO<MyPromptTemplate> createTemplate(@RequestBody MyPromptTemplate template) {
        try {
            MyPromptTemplate savedTemplate = promptTemplateService.saveTemplate(template);
            return RestVO.success(savedTemplate);
        } catch (Exception e) {
            return RestVO.fail("创建模板失败: " + e.getMessage());
        }
    }
    
    /**
     * 更新模板
     */
    @PutMapping("/{id}")
    public RestVO<MyPromptTemplate> updateTemplate(@PathVariable Long id, @RequestBody MyPromptTemplate template) {
        try {
            template.setId(id);
            MyPromptTemplate updatedTemplate = promptTemplateService.saveTemplate(template);
            return RestVO.success(updatedTemplate);
        } catch (Exception e) {
            return RestVO.fail("更新模板失败: " + e.getMessage());
        }
    }
    
    /**
     * 删除模板
     */
    @DeleteMapping("/{id}")
    public RestVO<String> deleteTemplate(@PathVariable Long id) {
        try {
            promptTemplateService.deleteTemplate(id);
            return RestVO.success("删除成功");
        } catch (Exception e) {
            return RestVO.fail("删除模板失败: " + e.getMessage());
        }
    }
    
    /**
     * 测试提示词模板流式接口
     * 直接使用前端编辑区的系统提示词字符串，不依赖模板ID
     * 兼容新增和编辑场景
     */
    @PostMapping(value = "/test-stream", produces = MediaType.TEXT_PLAIN_VALUE + ";charset=UTF-8")
    public Flux<String> testPromptStream(@RequestBody TestPromptQuestionVO question) {
        return promptTemplateService.processPromptTest(
                question.getMessage(),
                question.getSystemPromptStr(),
                question.getModelId()
        );
    }
    
    /**
     * 增加模板使用次数
     */
    @PostMapping("/{id}/increment-usage")
    public RestVO<String> incrementUsageCount(@PathVariable Long id) {
        try {
            promptTemplateService.incrementUsageCount(id);
            return RestVO.success("使用次数更新成功");
        } catch (Exception e) {
            return RestVO.fail("更新使用次数失败: " + e.getMessage());
        }
    }
}
